package a0.xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * author: xiaoxu
 * sax特点：
 * 1.基于事件驱动
 * 2.顺序读取，速度快
 * 3.不能读取任意节点（灵活性差）
 * 4.解析式占用内存小，更适用于对性能要求更高的设备上（android）
 **/
public class StudentHandler extends DefaultHandler {

    private List<Student> students = null;
    private Student s;//当前正在解析的对象
    private String tag;//用于记录正在解析的标签


    public List<Student> getStudents() {
        return students;
    }

    //开始解析文档时调用
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        students = new ArrayList<>();
        System.out.println("解析文档开始");
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        System.out.println("解析文档结束");
    }

    //读到xml开始标签时候调用

    /**
     *
     * @param uri 命名空间
     * @param localName 不带前缀的标签名 <student id="1">
     * @param qName 带前缀的标签名 <context:component-scan base-package="com.jingHang" annotation-config="true"/>
     * @param attributes 当前标签的属性集合
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);

        if ("student".equals(qName)){
            s = new Student();
            String id = attributes.getValue("id");
            s.setId(id);
        }
        tag=qName;
        System.out.println("startElement--"+tag);
    }
    //读到xml结束标签时会调用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if ("student".equals(qName)){
            students.add(s);
        }
        tag = null;
    }

    //读到xml文本内容时调用（空格，换行，字符）
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        if (tag != null){
            if ("name".equals(tag)){
                s.setName(new String(ch,start,length));
            }else if ("age".equals(tag)){
                String age = new String(ch,start,length);
                s.setAge(Integer.valueOf(age));
            }
        }
    }
}
